package com.hy;

/**
 * Created With IntelliJ IDEA.
 * Descriptions:删掉一个元素以后全为 1 的最长子数组
 *
 * 给你一个二进制数组 nums ，你需要从中删掉一个元素。
 * 请你在删掉元素的结果数组中，返回最长的且只包含 1 的非空子数组的长度。
 * 如果不存在这样的子数组，请返回 0 。
 *
 * 示例 1：
 * 输入：nums = [1,1,0,1]
 * 输出：3
 * 解释：删掉位置 2 的数后，[1,1,1] 包含 3 个 1 。
 *
 * 示例 2：
 * 输入：nums = [0,1,1,1,0,1,1,0,1]
 * 输出：5
 * 解释：删掉位置 4 的数字后，[0,1,1,1,1,1,0,1] 的最长全 1 子数组为 [1,1,1,1,1] 。
 *
 * 示例 3：
 * 输入：nums = [1,1,1]
 * 输出：2
 * 解释：你必须要删除一个元素。
 *
 * 提示：
 * 1 <= nums.length <= 105
 * nums[i] 要么是 0 要么是 1 。
 * <p>
 * User:Mr.Du
 * Date:2024/3/29
 * Time:15:02
 */
public class LongestSubarray {
    /**
     * 删掉一个元素以后全为 1 的最长子数组
     * @param nums 整数数组
     * @return 最长子数组的长度（如果不含0）；如果数组中全为0或为空，则返回-1
     */
    public int longestSubarray(int[] nums) {
        int n = nums.length; // 数组长度
        int l = 0, r = 0, res = 0, cnt = 0; // l左指针，r右指针，res记录最长子数组长度，cnt记录当前子数组中0的个数
        while(r < n){ // 遍历数组
            if(nums[r] == 0){
                cnt++; // 如果遇到0，cnt加1
            }
            while(cnt > 1){ // 当0的个数超过1时，移动左指针，直到cnt等于1
                if(nums[l] == 0){
                    cnt--;
                }
                l++;
            }
            r++; // 右指针右移
            res = Math.max(res, r - l - 1); // 更新最长子数组长度
        }
        return res;
    }
}
